package 传智播客_黑马.java高级.reflect反射;

import java.lang.reflect.Method;

//解析注解：(在写解析时向里传参)，解析注解就是把参数获取到,我们自己写的注解基本上都是干这个用的，有了注解我们就可以对这个案例进行优化：（这次我们不使用配置文件）
//1.首先我们自己定义一个注解，reflectTest1Anno。
// 2.在类上添加这个注解,@reflectTest1Anno(classname = "Person", methodname = "sleep")
//需求：在不改变代码的前提下，可以创建任意类，执行它的任意方法
@reflectTest1Anno(classname = "reflect.Person", methodname = "sleep")
public class reflectTest1 {

    public static void main(String[] args) throws Exception {
        Class<reflectTest1> reflectTest1Class = reflectTest1.class;
//        类里面有一个方法叫getAnnotatio(Class)方法，它可以获取这个类上面的注释(类和方法都可以调用这个getAnnotation(Class))，用这样一个接口去接就行了
//        其实这步getAnnotation相当于是定义了一个指定接口的实现类并返回这个类的对象
        reflectTest1Anno annotation = reflectTest1Class.getAnnotation(reflectTest1Anno.class);

        String classname = annotation.classname();
        String methodname = annotation.methodname();

//        注意这个类必须是完整路径，即包名.类名
        Class<?> cls = Class.forName(classname);    //获取Class对象.就是让对应的class文件进内存
        Object o = cls.newInstance();
        Method method = cls.getMethod(methodname);
        method.invoke(o);
    }
}
